<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Bytecode</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Bytecode"> <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Bytecode rootpage-Bytecode skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span lang="en">Bytecode</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr">
<p>
En <a href="Informatique" title="Informatique">informatique</a>, le <i><b><span class="lang-en" lang="en">bytecode</span></b></i> (terme <a href="Anglais" title="Anglais">anglais</a> signifiant « code en <a href="Byte" title="Byte">bytes</a> ») est un code intermédiaire entre les <a href="Instruction_machine" class="mw-redirect" title="Instruction machine">instructions machines</a> et le <a href="Code_source" title="Code source">code source</a>, qui n'est pas directement exécutable. Le <i><span class="lang-en" lang="en">bytecode</span></i> (également appelé code portable ou p-code) peut être créé à la volée et résider en mémoire (<a href="Compilation_%C3%A0_la_vol%C3%A9e" title="Compilation à la volée">compilation à la volée</a>, JIT (<i><span class="lang-en" lang="en">Just-In-Time compilation</span></i>) en anglais) ou bien résider dans un fichier, généralement <a href="Fichier_binaire" title="Fichier binaire">binaire</a> qui représente le <a href="Programme_informatique" title="Programme informatique">programme</a>, tout comme un fichier de <a href="Code_objet" title="Code objet">code objet</a> produit par un <a href="Compilateur" title="Compilateur">compilateur</a>.
</p><p>Puisque c'est un code qui n'est pas exécutable directement par un <a href="Processeur" title="Processeur">processeur</a> (à l'exception de certains processeurs gérant le <a href="Bytecode_Java" title="Bytecode Java"><i><span class="lang-en" lang="en">bytecode</span></i> Java</a> nativement), il est utilisé par les créateurs de <a href="Langage_de_programmation" title="Langage de programmation">langages de programmation</a> en guise de code intermédiaire réduisant la dépendance vis-à-vis du <a href="Architecture_Hardware" class="mw-redirect" title="Architecture Hardware">matériel</a> et facilitant son <a href="Interpr%C3%A8te_(informatique)" title="Interprète (informatique)">interprétation</a> sur plusieurs architectures.
</p><p>Certains compilateurs, comme <a href="LLVM" title="LLVM">LLVM</a>, et langages de scripts, comme <a href="SmallTalk" class="mw-redirect" title="SmallTalk">SmallTalk</a>, <a href="Java_(langage)" title="Java (langage)">Java</a> ou certaines implémentations de <a href="Ruby" title="Ruby">Ruby</a> (telles que <a href="JRuby" title="JRuby">JRuby</a>, Ruby.NET ou SmallRuby), utilisent le <i><span class="lang-en" lang="en">bytecode</span></i> comme <a href="Repr%C3%A9sentation_interm%C3%A9diaire" class="mw-redirect" title="Représentation intermédiaire">représentation intermédiaire</a> avant la transformation en code machine vers l'architecture cible (<a href="X86" title="X86">x86</a>, <a href="Architecture_ARM" title="Architecture ARM">ARM</a>, <a href="Architecture_MIPS" title="Architecture MIPS">MIPS</a>, etc.).
</p><p>Certains systèmes, appelés « traducteurs dynamiques » ou « <a href="Compilation_%C3%A0_la_vol%C3%A9e" title="Compilation à la volée">compilateurs à la volée</a> » (<i><span class="lang-en" lang="en">JIT (just-in-time) compilers</span></i> en anglais), traduisent le <i><span class="lang-en" lang="en">bytecode</span></i> en code machine au fur et à mesure de l’exécution, cela permet d’accélérer l’exécution sur les boucles ou les fonctions appelées plusieurs fois tout en évitant de stocker sur disque ou de transférer via les réseaux des données précompilées. Cette technique est notamment utilisée dans le langage Java et dans les émulateurs de systèmes (ordinateurs ou consoles de jeu par exemple), retranscrivant les instructions d'un langage machine à un autre et plus généralement d'une architecture matérielle à une autre.
</p><p>Un programme à base de <i><span class="lang-en" lang="en">bytecode</span></i> est exécuté par un <a href="Interpr%C3%A8te_(informatique)" title="Interprète (informatique)">interpréteur</a> appelé <a href="Machine_virtuelle" title="Machine virtuelle">machine virtuelle</a>, car elle exécute le code tout comme un microprocesseur. L'avantage est la portabilité : le même <i><span class="lang-en" lang="en">bytecode</span></i> peut être exécuté sur diverses <a href="Plate-forme_(informatique)" class="mw-redirect" title="Plate-forme (informatique)">plates-formes</a> ou <a href="Architecture_informatique" class="mw-redirect" title="Architecture informatique">architectures</a> pour lesquelles un interpréteur existe. Un programme sous forme de <i><span class="lang-en" lang="en">bytecode</span></i> peut donc être transmis d'une machine à une autre, et être interprété puis exécuté sans modification de celui-ci par différents types d'architectures matérielles. L'avantage est le même que pour les <a href="Langage_de_script" title="Langage de script">scripts</a>, qui sont directement interprétés (et non compilés en <i><span class="lang-en" lang="en">bytecode</span></i>). Cependant, le <i><span class="lang-en" lang="en">bytecode</span></i> est plus concret, plus compact et plus facile à manipuler qu'un script, prévu pour être intelligible par l'homme. Pour ces raisons, les performances des interpréteurs de <i><span class="lang-en" lang="en">bytecode</span></i> sont généralement bien meilleures que celles des interpréteurs de scripts.
</p><p>Pour bénéficier de ces avantages, aujourd'hui de nombreux langages interprétés sont en fait compilés en <i><span class="lang-en" lang="en">bytecode</span></i> avant d'être exécutés par un interpréteur. C'est le cas par exemple de <a href="PHP" title="PHP">PHP</a> (lorsqu'il est utilisé pour des applications), de <a href="Tcl_(langage)" class="mw-redirect" title="Tcl (langage)">Tcl</a>, de <a href="Python_(langage)" title="Python (langage)">Python</a>. Un programme <a href="Java_(langage)" title="Java (langage)">Java</a> est habituellement transmis sous forme de <i><span class="lang-en" lang="en">bytecode</span></i> à une machine hôte qui utilisera une compilation à la volée pour traduire le <i><span class="lang-en" lang="en">bytecode</span></i> en code machine avant exécution. Les implémentations actuelles de <a href="Perl_(langage)" title="Perl (langage)">Perl</a> et de <a href="Ruby" title="Ruby">Ruby</a> utilisent non pas du <i><span class="lang-en" lang="en">bytecode</span></i>, mais une structure en arbre qui se rapproche de la représentation intermédiaire des compilateurs.
</p><p>Les <i>p-codes</i> diffèrent des <i><span class="lang-en" lang="en">bytecodes</span></i> par le codage de leurs opérations, qui peut être de plusieurs octets avec une taille variable, tout comme les <i><a href="Langage_machine" title="Langage machine">opcodes</a></i> de nombreux processeurs. Ils ont un plus haut niveau descriptif, comme « afficher cette chaine de caractères » ou encore « effacer l'écran ». Le <a href="BASIC" class="mw-redirect" title="BASIC">BASIC</a> et quelques versions de <a href="Pascal_(langage)" title="Pascal (langage)">Pascal</a> utilisent un <i>p-code</i>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Exemples">Exemples</h2></div>
<ul><li>O-code de <a href="BCPL" title="BCPL">BCPL</a> ;</li>
<li>CLISP, une implémentation de <a href="Common_Lisp" title="Common Lisp">Common Lisp</a>, ne compile qu'en <i><span class="lang-en" lang="en">bytecode</span></i> ;</li>
<li><a href="CMUCL" class="mw-redirect" title="CMUCL">CMUCL</a>, une implémentation de <a href="Common_Lisp" title="Common Lisp">Common Lisp</a>, peut compiler en <i><span class="lang-en" lang="en">bytecode</span></i> ou en code natif ; le code natif est bien plus compact ;</li>
<li><a href="Objective_Caml" class="mw-redirect" title="Objective Caml">OCaml</a> peut compiler un <i><span class="lang-en" lang="en">bytecode</span></i> compact, mais pas seulement ; le <i><span class="lang-en" lang="en">bytecode</span></i> d'OCaml et son interpréteur (<i><span class="lang-en" lang="en">ocamlrun</span></i>) semblent former l'une des combinaisons les plus efficaces <sup class="need_ref_tag" style="padding-left:2px;"><span title="Ce passage nécessite une référence ; voir l'aide.">[réf. nécessaire]</span></sup> parmi tous les <i><span class="lang-en" lang="en">bytecodes</span></i> existants ;</li>
<li><a href="Microsoft_.NET" title="Microsoft .NET">Microsoft .NET</a> <a href="Common_Intermediate_Language" title="Common Intermediate Language">Common Intermediate Language</a>, exécuté par le <a href="Common_Language_Runtime" title="Common Language Runtime">Common Language Runtime</a> ;</li>
<li><a href="Java_(langage)" title="Java (langage)">Java</a> de <a href="Sun_Microsystems" title="Sun Microsystems">Sun Microsystems</a> (voir <a href="Bytecode_Java" title="Bytecode Java">Bytecode Java</a>) ;</li>
<li><a href="Python_(langage)" title="Python (langage)">Python</a>, où un module (fichier module.py) est <b>compilé</b> vers du <i><span class="lang-en" lang="en">bytecode</span></i> (fichier module.pyc) à l'importation durant l'exécution, mais pas nécessairement à l'exécution ;</li></ul>
<div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span></span><span class="o">>>></span> <span class="kn">import</span><span class="w"> </span><span class="nn">dis</span> <span class="c1">#"dis" - Disassembler of Python byte code into mnemonics.</span>
<span class="o">>>></span> <span class="n">dis</span><span class="o">.</span><span class="n">dis</span><span class="p">(</span><span class="s1">'print("Hello, World!")'</span><span class="p">)</span>
<span class="mi">1</span> <span class="mi">0</span> <span class="n">LOAD_NAME</span> <span class="mi">0</span> <span class="p">(</span><span class="nb">print</span><span class="p">)</span>
<span class="mi">2</span> <span class="n">LOAD_CONST</span> <span class="mi">0</span> <span class="p">(</span><span class="s1">'Hello, World!'</span><span class="p">)</span>
<span class="mi">4</span> <span class="n">CALL_FUNCTION</span> <span class="mi">1</span>
<span class="mi">6</span> <span class="n">RETURN_VALUE</span>
</pre></div>
<ul><li>Le SPIN du Propeller de <a href="Parallax_Inc." title="Parallax Inc.">Parallax Inc.</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Voir_aussi">Voir aussi</h2></div>
<style data-mw-deduplicate="TemplateStyles:r194021218">
/* start https://fr.wikipedia.org/ */
.mw-parser-output .autres-projets>.titre{text-align:center;margin:0.2em 0}.mw-parser-output .autres-projets>ul{margin:0;padding:0}.mw-parser-output .autres-projets>ul>li{list-style:none;margin:0.2em 0;text-indent:0;padding-left:24px;min-height:20px;text-align:left;display:block}.mw-parser-output .autres-projets>ul>li>a{font-style:italic}@media(max-width:720px){.mw-parser-output .autres-projets{float:none}}
/* end https://fr.wikipedia.org/ */
</style>
<div class="navbox-container" style="clear:both;">
</div>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2025-01-31" href="https://fr.wikipedia.org/wiki/?title=Bytecode&oldid=222562901">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>
</body></html>